package pe.edu.upc.dai.grupovictor.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupovictor.dao.DetalleSistemaEvaluacionDao;
import pe.edu.upc.dai.grupovictor.dao.util.ConnectionUtils;
import pe.edu.upc.dai.grupovictor.dao.util.DaoException;
import pe.edu.upc.dai.grupovictor.model.DetalleSistemaEvaluacion;
import pe.edu.upc.dai.grupovictor.model.SistemaEvaluacion;
import pe.edu.upc.dai.grupovictor.model.TipoEvaluacion;

public class DetalleSistemaEvaluacionDaoImpl implements DetalleSistemaEvaluacionDao {

    public DetalleSistemaEvaluacion seleccionarPorPrimaryKey(Long id) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        DetalleSistemaEvaluacion detalle = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("" +
                    "SELECT D.ID_DETALLE,D.ID_SISTEMA_EVALUACION,D.PESO_EVALUACION, " +
                    "       T.ID_TIPO_EVALUACION,T.NOMBRE_TIPO_EVALUACION " +
                    "FROM DETALLE_SISTEMA_EVALUACION D " +
                    "JOIN TIPO_EVALUACION T ON D.ID_TIPO_EVALUACION = T.ID_TIPO_EVALUACION " +
                    "WHERE D.ID_DETALLE = ? ");
            st.setLong(1, id);
            rs = st.executeQuery();
            if (rs.next()) {
                TipoEvaluacion tipoEvaluacion = new TipoEvaluacion();
                tipoEvaluacion.setIdTipoEvaluacion(rs.getLong("ID_TIPO_EVALUACION"));
                tipoEvaluacion.setNombreTipoEvaluacion(rs.getString("NOMBRE_TIPO_EVALUACION"));

                SistemaEvaluacion sistemaEval = new SistemaEvaluacion();
                sistemaEval.setIdSistemaEvaluacion(rs.getLong("ID_SISTEMA_EVALUACION"));

                detalle = new DetalleSistemaEvaluacion();
                detalle.setIdDetalle(rs.getLong("ID_DETALLE"));
                detalle.setPesoEvaluacion(rs.getFloat("PESO_EVALUACION"));
                detalle.setIdSistemaEvaluacion(sistemaEval);
                detalle.setIdTipoEvaluacion(tipoEvaluacion);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return detalle;
    }

    public DetalleSistemaEvaluacion seleccionarPorNombre(String nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Long getIdSiguiente() {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Long id = null;

        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("" + "select max(se.id_detalle)+1 id " + "from detalle_sistema_evaluacion se ");
            rs = st.executeQuery();
            if (rs.next()) {
                id = rs.getLong("ID");
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return id;
    }

    public void insertar(DetalleSistemaEvaluacion detalle) {
        Long id = getIdSiguiente();
        detalle.setIdDetalle(id);

        Connection connection = null;
        PreparedStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("INSERT INTO DETALLE_SISTEMA_EVALUACION(ID_DETALLE,ID_SISTEMA_EVALUACION,ID_TIPO_EVALUACION,PESO_EVALUACION) VALUES(?,?,?,?)");
            st.setLong(1, detalle.getIdDetalle());
            st.setLong(2, detalle.getIdSistemaEvaluacion().getIdSistemaEvaluacion());
            st.setLong(3, detalle.getIdTipoEvaluacion().getIdTipoEvaluacion());
            st.setFloat(4, detalle.getPesoEvaluacion());
            st.execute();
            ConnectionUtils.commit(connection);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
    }

    public void actualizar(DetalleSistemaEvaluacion detalleSistemaEvaluacion) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(DetalleSistemaEvaluacion detalle) {
        Connection connection = null;
        PreparedStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("DELETE DETALLE_SISTEMA_EVALUACION SE WHERE SE.ID_DETALLE = ?");
            st.setLong(1, detalle.getIdDetalle());
            st.execute();
            ConnectionUtils.commit(connection);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
    }

    public List<DetalleSistemaEvaluacion> seleccionarTodosByPadre(DetalleSistemaEvaluacion detalleSis) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        DetalleSistemaEvaluacion detalle = null;
        List<DetalleSistemaEvaluacion> lista = new ArrayList<DetalleSistemaEvaluacion>();
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("" +
                    "SELECT D.ID_DETALLE,D.ID_SISTEMA_EVALUACION,D.PESO_EVALUACION, " +
                    "       T.ID_TIPO_EVALUACION,T.NOMBRE_TIPO_EVALUACION " +
                    "FROM DETALLE_SISTEMA_EVALUACION D " +
                    "JOIN TIPO_EVALUACION T ON D.ID_TIPO_EVALUACION = T.ID_TIPO_EVALUACION " +
                    "WHERE D.ID_SISTEMA_EVALUACION = ? ");

            st.setLong(1, detalleSis.getIdSistemaEvaluacion().getIdSistemaEvaluacion());
            rs = st.executeQuery();
            while (rs.next()) {
                detalle = mapResultSet(rs);
                lista.add(detalle);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return lista;
    }

    private DetalleSistemaEvaluacion mapResultSet(ResultSet rs) throws SQLException {
        TipoEvaluacion tipoEvaluacion = new TipoEvaluacion();
        tipoEvaluacion.setIdTipoEvaluacion(rs.getLong("ID_TIPO_EVALUACION"));
        tipoEvaluacion.setNombreTipoEvaluacion(rs.getString("NOMBRE_TIPO_EVALUACION"));

        SistemaEvaluacion sistemaEval = new SistemaEvaluacion();
        sistemaEval.setIdSistemaEvaluacion(rs.getLong("ID_SISTEMA_EVALUACION"));

        DetalleSistemaEvaluacion detalle = new DetalleSistemaEvaluacion();
        detalle.setIdDetalle(rs.getLong("ID_DETALLE"));
        detalle.setPesoEvaluacion(rs.getFloat("PESO_EVALUACION"));
        detalle.setIdSistemaEvaluacion(sistemaEval);
        detalle.setIdTipoEvaluacion(tipoEvaluacion);

        return detalle;
    }
}
